/* The file is saved in UTF-8 codepage.
 * Check: «Stereotype», Section mark-§, Copyright-©, Alpha-α, Beta-β, Smile-☺
 */
package cz.pecinovsky.english.lootp._134_;


import cz.pecinovsky.english.lootp.manager.IMoveable;
import cz.pecinovsky.english.lootp.manager.IMultimoveable;
import cz.pecinovsky.english.lootp.manager.Painter;
import cz.pecinovsky.english.lootp.manager.Multimover;


import cz.pecinovsky.english.lootp.manager.CanvasManager_Envelope.               CanvasManager;




import cz.pecinovsky.english.lootp._134_.Ring_134_.Ring;
import cz.pecinovsky.english.lootp._134_.RoadField_134_.RoadField;


//import cz.pecinovsky.english.lootp._134_.Round_135_      .Round;
////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ End of ignored starting test - place for imports +++++
//%I+
//
//import cz.pecinovsky.english.lootp.canvasmanager.IMoveable;
//import cz.pecinovsky.english.lootp.canvasmanager.IMultimoveable;
//import cz.pecinovsky.english.lootp.canvasmanager.Painter;
//import cz.pecinovsky.english.lootp.canvasmanager.Multimover;
//import cz.pecinovsky.english.lootp.canvasmanager.CanvasManager;
//%I-

import cz.pecinovsky.english.lootp.utility.Position;
//%X+ xxxxx Start of the ovejumped text with declaration of the envelope xxxxx
/*******************************************************************************
 *<pre>
 * Předchozí:   Není - toto_je_nově_definovaná_třída
 *              Ttt v projektu Ppp
 * Následující: Prozatím není
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 */
public class Round_135_
{    private Round_135_() {}   static
////////////////////////////////////////////////////////////////////////////////
//%X- ----- End of the ovejumped text with declaration of the envelope -----


/*******************************************************************************
 * Instance třídy {@code Round} představují dekorátory posuvných objektů,
 * které je dekorují schopností jezdit po okruhu.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
public class Round implements IMultimoveable
{
//== CONSTANT CLASS ATTRIBUTES =================================================

    /** Implicitní speed, kterou se objekty přesouvají. */
    private static final int DEFAULT_SPEED = 100;

    /** Správce plátna, na němž budou objekty zobrazovány. */
    private static final CanvasManager CM = CanvasManager.getInstance();



//== VARIABLE CLASS ATTRIBUTES =================================================
//== STATIC CONSTRUCTOR (CLASS INITIALIZER, STATIC INICITALIZING BLOCK) ========
//== CONSTANT INSTANCE ATTRIBUTES ==============================================

    /** Dekorovaný objekt, kterým se bude objíždět nějaký okruh. */
    private final IMoveable decorated;



//== VARIABLE INSTANCE ATTRIBUTES ==============================================

    /** Rychlost, kterou se objekt přesouvá. */
    private int speed = DEFAULT_SPEED;

    /** Pole, ze kterého objekt naposledy "vyjel". */
    private RoadField field;



//== CLASS GETTERS AND SETTERS =================================================
//== OTHER NON-PRIVATE CLASS METHODS ===========================================

//##############################################################################
//== CONSTUCTORS AND FACTORY METHODS ===========================================

    /***************************************************************************
     * Vytvoří novou instanci obalující a dekorující zadaný posuvný objekt.
     *
     * @param decorated Obalovaný a decorated objekt
     */
    public Round(IMoveable decorated)
    {
        this.decorated = decorated;
    }



//== ABSTRACT METHODS ==========================================================
//== INSTANCE GETTERS AND SETTERS ==============================================

    /***************************************************************************
     * Vrátí přepravku se souřadnicemi instance.
     *
     * @return  Přepravka se souřadnicemi instance
     */
    @Override
    public Position getPosition()
    {
        return decorated.getPosition();
    }


    /***************************************************************************
     * Nastaví novou pozici instance.
     *
     * @param pozice  Nová pozice instance
     */
    @Override
    public void setPosition(Position pozice)
    {
        decorated.setPosition(pozice);
    }


    /***************************************************************************
     * Nastaví novou pozici instance.
     *
     * @param x   Nová x-ová pozice instance
     * @param y   Nová y-ová pozice instance
     */
    @Override
    public void setPosition(int x, int y)
    {
        decorated.setPosition(x, y);
    }


    /***************************************************************************
     * Nastaví novou speed přesunu instance;
     * tato speed ale začne platit až od příštího startu.
     *
     * @param speed  Nastavovaná speed
     */
    public void setSpeed(int speed)
    {
        this.speed = speed;
    }



//%X+
    @Override public int getX() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    @Override public int getY() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
//%X-
//== OTHER NON-PRIVATE INSTANCE METHODS ========================================

    /***************************************************************************
     * Prostřednictvím dodaného kreslítka vykreslí obraz své instance.
     *
     * @param painter Painter, které nakreslí instanci
     */
    @Override
    public void paint(Painter painter)
    {
        decorated.paint(painter);
    }


    /***************************************************************************
     * Přistaví decorated objekt na zadaný okruh
     * a začne s ním tento okruh objíždět.
     *
     * @param okruh Ring, který se má objíždět
     */
    public void objížděj(Ring okruh)
    {
        RoadField start = okruh.getPočátek();
        pokračujZ(start);
    }


    /***************************************************************************
     * Přistaví decorated objekt na zadané pole a vyjede s ním dál.
     *
     * @param pole Výchozí pole, ze kterého se bude pokračovat dál
     */
    public void pokračujZ(RoadField pole)
    {
        this.field = pole;
        Position pozice = pole.getPosition();
        decorated.setPosition(pozice);
        CM.add(this);
        moved();
    }


    /***************************************************************************
     * Metoda vyvolaná multipřesouvačem poté, co dovedl svěřený objekt
     * do zadané cílové pozice. Při svém typickém použití metoda nastaví
     * novou cílovou pozici své instance a instanci opět předá multipřesouvači.
     */
    @Override
    public void moved()
    {
        field = field.getDalší();
        Position pozice = field.getPosition();
        Multimover m = Multimover.getInstance();
        m.přesuňRychlostí(speed, this, pozice);
    }


    /***************************************************************************
     * Vrací textovou reprezentaci (podpis) dané instance
     * používanou především k ladicím účelům.
     *
     * @return Požadovaná textová reprezentace
     */
    @Override
    public String toString()
    {
        return "Okružní_(" + decorated.toString() + ")";
    }



//== PRIVATE AND AUXILIARY CLASS METHODS =======================================
//== PRIVATE AND AUXILIARY INSTANCE METHODS ====================================
//== EMBEDDED TYPES AND INNER CLASSES ==========================================
//== TESTING CLASSES AND METHODS ===============================================
//
//    /***************************************************************************
//     * Test method.
//     */
//    public static void test()
//    {
//        Round inst = new Round();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main(String[] args)  {  test();  }
    }

//%%- ---- Start of the ovejumped text with closing of the envelope ----
////////////////////////////////////////////////////////////////////////////////
//== TESTING CLASSES AND METHODS ===============================================
//
//    /***************************************************************************
//     * Test method.
//     */
//    public static void test()
//    {
//        System.exit(0);
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main(String[] args)  {  test();  }
}
